package com.company.test.proxy;

import java.io.Serializable;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.util.Arrays;

/**
 * @author zhangyan
 * @version $ Id: MapperProxy.java, v 0.1 2020/9/15 19:37 zhangyan Exp $
 */
public class MapperProxy<T> implements InvocationHandler, Serializable {
    private final Class<T> mapperInterface;

    public MapperProxy(Class<T> mapperInterface) {
        this.mapperInterface = mapperInterface;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //一般DEBUG时，我们查看变量时，会调用其toString()方法，由于该方法也会被代理，所以出现递归调用，
        //这里为了避免DEBUG时，重复调用方法，所以作特殊处理
        if (Object.class.equals(method.getDeclaringClass().getClass())) {
            return method.invoke(this, args);
        }
        System.out.println("方法前");
        //这里是为接口的方法构造实现逻辑，
        // 由于我们已经获取到了方法名称和参数值，所以可以根据实际需要去创建实现逻辑。
        Object o = "方法名称:" + method.getName() + ",参数值:" + Arrays.toString(args) + ",clazz:" + mapperInterface;
        System.out.println("方法后");
        return o;
    }
}
